home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 626-637 / disk_632 / printfiles / source / prf_print.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  7KB  |  265 lines

  1. /* prf_print.c  */
  2. /* V1.1 14-3-92 */
  3.  
  4. #include "prf.h"
  5.  
  6. char  *dayname[]=
  7.        {
  8.         T_SUNDAY,T_MONDAY,T_TUESDAY,T_WEDNESDAY,T_THURSDAY,T_FRIDAY,T_SATURDAY
  9.        };
  10. char  *monthname[]=
  11.        {
  12.         T_JAN,T_FEB,T_MAR,T_APR,T_MAY,T_JUNE,T_JULY,T_AUG,T_SEP,T_OCT,T_NOV,T_DEC
  13.        };
  14.  
  15. long BuildStatusline(struct prf_info *,UBYTE *);
  16. long CheckFile(struct prf_info *,UBYTE *);
  17. long PopFile(struct prf_info *,UBYTE *);
  18. void PushFile(struct prf_info *,UBYTE *);
  19. long PrintText(struct prf_info *,UBYTE *);
  20.  
  21.  
  22. void PrintQueue(struct prf_info *info)
  23. {
  24.  long     end = FALSE;
  25.  UBYTE    filename[256];
  26.  FILE    *display = NULL;
  27.  info->flags |= FLAG_PRINT;
  28.  if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,TRUE,TAG_DONE);
  29.  if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,TRUE,TAG_DONE);
  30.  if(info->Swd)
  31.  {
  32.   SwdTags[0].ti_Data = (ULONG)info->Swd->LeftEdge;
  33.   SwdTags[1].ti_Data = (ULONG)info->Swd->TopEdge;
  34.  }
  35.  sprintf(filename,"CON:%ld/%ld/%ld/%ld/%s",
  36.                    SwdTags[0].ti_Data,SwdTags[1].ti_Data,
  37.                    SwdTags[2].ti_Data,info->BarHeight * 4,T_DISPLAYNAME);
  38.  if((info->flags & FLAG_DISPLAY) && ((info->Pwd) || (info->Swd)))
  39.     display = fopen(filename,"w");
  40.  while (!end  && PopFile(info,filename))
  41.  {
  42.   if(display)fprintf(display,"\n%s",filename);
  43.   switch(CheckFile(info,filename))
  44.   {
  45.    case FILE_TEXT : if(PrintText(info,filename) == CMD_QUIT) end = TRUE;
  46.                     info->Special1 = (APTR)filename;
  47.                     RemoveName(info);
  48.                     info->Special1 = NULL;
  49.                     break;
  50.    case FILE_ILBM : if(display)fprintf(display,ERROR_ILBM);break;
  51.    case FILE_FTXT : if(display)fprintf(display,ERROR_FTXT);break;
  52.    case FILE_PROG : if(display)fprintf(display,ERROR_PROG);break;
  53.    case FILE_ICON : if(display)fprintf(display,ERROR_ICON);break;
  54.    case FILE_DIR  : if(display)fprintf(display,ERROR_DIR);break;
  55.    default        : end = TRUE;
  56.                     break;
  57.   }
  58.  }
  59.  if(display) fclose(display);
  60.  if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,FALSE,TAG_DONE);
  61.  if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,FALSE,TAG_DONE);
  62.  info->flags ^= FLAG_PRINT;
  63. }
  64.  
  65. long PrintText(struct prf_info *info,UBYTE *name)
  66. {
  67.  long rc     = CMD_NEUTRAL;
  68.  long line   = 0;
  69.  long lines  = 1;
  70.  long page   = 1;
  71.  long offset = 0;
  72.  FILE *printer;
  73.  FILE *file;
  74.  UBYTE buffer[STR_SIZE];
  75.  long end = FALSE;
  76.  if(file = fopen(name,"r"))
  77.  {
  78.   if(printer = fopen("prt:","w"))
  79.   {
  80.    if(info->Columns <= 0L) info->Columns = 1L;
  81.    if(info->flags & FLAG_DRAFT)  fprintf(printer,"\x1b[1\x22z");
  82.    if(info->flags & FLAG_LQ)     fprintf(printer,"\x1b[2\x22z");
  83.    if(info->flags & FLAG_PITCH6) fprintf(printer,"\x1b[1z");
  84.    if(info->flags & FLAG_PITCH8) fprintf(printer,"\x1b[0z");
  85.    if(info->flags & FLAG_10CPI)  fprintf(printer,"\x1b[0w");
  86.    if(info->flags & FLAG_12CPI)  fprintf(printer,"\x1b[0w\x1b[2w");
  87.    if(info->flags & FLAG_15CPI)  fprintf(printer,"\x1b[0w\x1b[4w");
  88.    fprintf(printer,"\x1b[%ld;%lds",info->Lmargin,info->Rmargin);
  89.    offset = BuildStatusline(info,name);
  90.    while(!end)
  91.    {
  92.     if(fgets(buffer,STR_SIZE,file))
  93.     {
  94.      if(DoCommand(info,HandleMsgs(info)) == CMD_QUIT)
  95.      {
  96.       end = TRUE;
  97.       rc  = CMD_QUIT;
  98.      }
  99.      if(line == (info->Lines - offset))
  100.      {
  101.       if(*(info->Footline))
  102.       {
  103.        fprintf(printer,"%s\n",info->Footline);
  104.        if (strlen(info->Footline) > info->Columns) line += strlen(info->Footline)/info->Columns;
  105.       }
  106.       if(info->flags & FLAG_PAGE) fprintf(printer,"*** " T_PAGE ": %5d ***",page);
  107.       fprintf(printer,"\f");
  108.       line = 0;line = 0;page++;
  109.      }
  110.      if(line == 0)
  111.      {
  112.       if(*(info->Statusline))
  113.       {
  114.        fprintf(printer,"%s\n",info->Statusline);
  115.        if (strlen(info->Statusline) > info->Columns) line += strlen(info->Statusline)/info->Columns;
  116.       }
  117.       if(info->Headline)
  118.       {
  119.        fprintf(printer,"%s\n\n",info->Headline);
  120.        if (strlen(info->Headline) > info->Columns) line += strlen(info->Headline)/info->Columns;
  121.       }
  122.      }
  123.      if(info->flags & FLAG_LINE)
  124.      {
  125.       fprintf(printer,"%5d:%s",lines,buffer) ;
  126.       if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
  127.      }
  128.      else
  129.      {
  130.       fprintf(printer,"%s",buffer);
  131.       if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
  132.      }
  133.      if(info->flags & FLAG_CRLF) fprintf(printer,"\n");
  134.      line++,lines++;
  135.     }
  136.     else end = TRUE;
  137.    }
  138.    if(*(info->Footline))fprintf(printer,"%s\n",info->Footline);
  139.    if(info->flags & FLAG_PAGE) fprintf(printer,"*** %5d " T_PAGES T_PRINTED "***\n",page);
  140.    if(info->flags & FLAG_FF) fprintf(printer,"\f");
  141.    fclose(printer);
  142.   }
  143.   else
  144.   {
  145.    PushFile(info,name); /* file not found */
  146.   }
  147.   fclose(file);
  148.  }
  149.  return rc;
  150. }
  151.  
  152. long CheckFile(struct prf_info *info, UBYTE *name)
  153. {
  154.  long rc = FILE_TEXT;
  155.  struct FileInfoBlock *fib;
  156.  BPTR fh,lock;
  157.  if(stricmp(name + (strlen(name) - 5), ".info"))
  158.  {
  159.   if(fib = (struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))
  160.   {
  161.    if(lock = Lock(name,ACCESS_READ))
  162.    {
  163.     if(Examine(lock,fib))
  164.     {
  165.      if(fib->fib_DirEntryType > 0)
  166.      {
  167.       rc = FILE_DIR;
  168.      }
  169.      else
  170.      {
  171.       if(!(fib->fib_Protection & FIBB_SCRIPT))
  172.       {
  173.        if(fh = Open(name,MODE_OLDFILE))
  174.        {
  175.         UBYTE b[10];
  176.         if(Read(fh,b,4))
  177.         if(!(strnicmp(b,"\00\00\03\f3",4)))
  178.         {
  179.          rc = FILE_PROG;
  180.         }
  181.         if( (!(strnicmp(b,"form",4))) || (!(strnicmp(b,"list",4))) ||
  182.             (!(strnicmp(b,"prop",4))) || (!(strnicmp(b,"cat" ,3)))
  183.           )
  184.         {
  185.          Read(fh,b,4);  /* read length of file */
  186.          Read(fh,b,4);  /* read form type */
  187.          if(!(strnicmp(b,"ftxt",4)))rc = FILE_FTXT;
  188.           else if(!(strnicmp(b,"ilbm",4)))rc = FILE_ILBM;
  189.            else rc = FILE_UNKNOWN;
  190.         }
  191.         Close(fh);
  192.        }
  193.       }
  194.      }
  195.     }
  196.     UnLock(lock);
  197.    }
  198.    FreeDosObject(DOS_FIB,(APTR)fib);
  199.   }
  200.  }
  201.  else rc = FILE_ICON;
  202.  return rc;
  203. }
  204.  
  205. long PopFile(struct prf_info *info,UBYTE *name)
  206. {
  207.  long rc = FALSE;
  208.  struct FileNameNode *fnn;
  209.  DetachList(info);
  210.  if(fnn = (struct FileNameNode *)RemHead(&info->FileList))
  211.  {
  212.   if(*(fnn->fnn_Name))
  213.   {
  214.    rc = TRUE;
  215.    strcpy(name,fnn->fnn_Name);
  216.    free(fnn);
  217.   }
  218.  }
  219.  AttachList(info);
  220.  return rc;
  221. }
  222.  
  223. void PushFile(struct prf_info *info,UBYTE *name)
  224. {
  225.  struct FileNameNode *fnn;
  226.  if(*name)
  227.  {
  228.   if(fnn = calloc(1,sizeof(struct FileNameNode)))
  229.   {
  230.    strcpy(fnn->fnn_Name,name);
  231.    fnn->fnn_Node.ln_Name = fnn->fnn_Name;
  232.    DetachList(info);
  233.    AddHead(&info->FileList,(struct Node *)fnn);
  234.    AttachList(info);
  235.   }
  236.  }
  237. }
  238.  
  239. long BuildStatusline(struct prf_info *info,UBYTE *name)
  240. {
  241.  long rc = 0;
  242.  char buffer1[STR_SIZE],buffer2[STR_SIZE],buffer3[STR_SIZE];
  243.  long t;
  244.  struct tm *date;
  245.  time(&t);
  246.  date = localtime(&t);
  247.  *buffer1 = '\0';
  248.  *buffer2 = '\0';
  249.  *buffer3 = '\0';
  250.  if(info->flags & FLAG_DATE) sprintf(buffer1,DATE_FORMAT);
  251.  if(info->flags & FLAG_TIME) sprintf(buffer2,TIME_FORMAT);
  252.  if(info->flags & FLAG_FILE) sprintf(buffer3,NAME_FORMAT);
  253.  if((*(buffer1)) || (*(buffer2)) || (*(buffer3)))
  254.  {
  255.   sprintf(info->Statusline,"*** %s%s%s ***",buffer1,buffer2,buffer3);
  256.   rc += 1;
  257.  }
  258.  if(info->flags & FLAG_PAGE)rc += 1;
  259.  if(*(info->Headline))rc += 2;
  260.  if(*(info->Footline))rc += 1;
  261.  return rc;
  262. }
  263.  
  264.  
  265.